home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 16 / CU Amiga Magazine's Super CD-ROM 16 (1997-10-16)(EMAP Images)(GB)[!][issue 1997-11].iso / CUCD / Graphics / Ghostscript / source / writecff.ps < prev    next >
Text File  |  1997-05-28  |  10KB  |  380 lines

  1. %    Copyright (C) 1997 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % writecff.ps
  16. % Write out a Type 1 font as CFF.
  17. % **************** THIS FILE DOES NOT WORK. ****************
  18. % **************** DON'T TRY TO USE IT. ****************
  19.  
  20. currentglobal true setglobal
  21. (gs_cff.ps) runlibfile
  22. (t1tot2.ps) runlibfile
  23. setglobal
  24.  
  25. 50 dict begin
  26.  
  27. % ---------------- Standard strings/names ---------------- %
  28.  
  29. /FontSetInit /ProcSet findresource begin mark
  30.  
  31. /StandardSIDs StandardStrings length 1.5 mul cvi dict
  32. dup 0 1 StandardStrings length 1 sub {
  33.   dup StandardStrings exch get exch put dup
  34. } for pop
  35.  
  36. end counttomark 2 idiv { def } repeat
  37.  
  38. % ---------------- Standard encodings ---------------- %
  39.  
  40. % ---------------- Standard Charsets ---------------- %
  41.  
  42. % ---------------- Output utilities ---------------- %
  43.  
  44. % Free variables: f (output file), fpos (position in f).
  45.  
  46. /advance {        % <n> advance -
  47.   fpos add /fpos exch store
  48. } def
  49. /next {            % <byte> next -
  50.   f exch write 1 advance
  51. } def
  52. /nextstring {        % <string|name> nextstring -
  53.   dup type /nametype eq { .namestring } if
  54.   f 1 index writestring length advance
  55. } def
  56. /card8            % <card8> card8 -
  57.   /next load
  58. def
  59. /card16 {        % <card16> card16 -
  60.   dup -8 bitshift next 255 and next
  61. } def
  62. /offset {        % <offset> <offsize> offset -
  63.   1 sub -1 0 { -8 mul 2 copy bitshift 255 and next pop } for pop
  64. } def
  65. /sid            % <sid> sid -
  66.   /card16 load
  67. def
  68. /lenoffsize {        % <length> lenoffsize <offsize>
  69.   dup 255 le { pop 1 } { -8 bitshift lenoffsize 1 add } ifelse
  70. } def
  71. /Index {        % [<string|name|null> ...] Index -
  72.     % Calculate the maximum offset we need to be able to represent.
  73.   1 1 index { dup null eq { pop } { length add } ifelse } forall lenoffsize
  74.     % stack: items offsize
  75.   1 index length card16
  76.   dup next
  77.   1 2 index {
  78.       % stack: items offsize pos item
  79.     1 index 3 index offset
  80.     dup null eq { pop } { length add } ifelse
  81.   } forall exch offset { nextstring } forall
  82. } def
  83. /idIndex {        % <dict> <base> idIndex -
  84.   1 index length array 3 -1 roll {
  85.     3 index sub 2 index exch 3 -1 roll put
  86.   } forall exch pop Index
  87. } def
  88. /stringid {        % <string|name> stringid <sid>
  89.   StandardSIDs 1 index .knownget {
  90.     exch pop
  91.   } {
  92.     sids 1 index .knownget {
  93.       exch pop
  94.     } {
  95.       StandardSIDs length sids length add sids 3 -1 roll 2 index put
  96.     } ifelse
  97.   } ifelse
  98. } def
  99. /.valuetypedict mark
  100.   /booleantype { { 1 } { 0 } ifelse intvalue }
  101.   /arraytype { { value } forall }
  102.   /packedarraytype 1 index
  103.   /stringtype { stringid intvalue }
  104.   /nametype 1 index
  105.   /realtype { realvalue }
  106.   /integertype { intvalue }
  107. .dicttomark readonly def
  108. /value {        % <obj> value -
  109.   dup type .valuetypedict exch get exec
  110. } def
  111. /.realchardict mark
  112.   48 1 57 { dup 48 sub } for    % digits
  113.   46 10   69 11   101 11    % . E e
  114.   45 {                % - -- handle E- specially
  115.     dup 15 and 11 eq { 15 or 12 } {
  116.       dup 16#bf eq { pop 255 12 } { 14 } ifelse
  117.     } ifelse
  118.   }
  119. .dicttomark readonly def
  120. /realvalue {        % <real> realvalue -
  121.   =string cvs 255 exch {
  122.     .realchardict exch get exec
  123.     1 index 15 and 15 ne { exch next 255 exch } if
  124.     1 index 240 and 240 eq { 4 bitshift 240 } { 15 } ifelse sub add
  125.   } forall next
  126. } def
  127. /intvalue {        % <int> intvalue -
  128.   dup dup -107 ge exch 107 le and { 139 add next } {
  129.     dup dup -1131 ge exch 0 lt and { neg 16#fa94 add card16 } {
  130.       dup dup 1131 le exch 0 ge and { 16#f694 add card16 } {
  131.     dup dup -32768 ge exch 32767 le and {
  132.       28 next 65535 and card16
  133.     } {
  134.       29 next dup -16 bitshift 2 { 65535 and card16 } repeat
  135.     } ifelse
  136.       } ifelse
  137.     } ifelse
  138.   } ifelse
  139. } def
  140. /op {            % <op> op -
  141.   dup 32 ge { 12 next 32 sub } if next
  142. } def
  143. /vdef {            % <obj> <op> vdef -
  144.   exch value op
  145. } def
  146. /nedef {        % <obj> <default> <op> nedef -
  147.   exch 2 index eq { pop pop } { vdef } ifelse
  148. } def
  149. /Dict {            % <dict> <opsdict> Dict -
  150.   exch {
  151.     % stack: opsdict key value
  152.     2 index 3 -1 roll .knownget {
  153.       dup type /integertype eq { vdef } { exec } ifelse
  154.     } {
  155.       pop
  156.     } ifelse
  157.   } forall pop
  158. } def
  159. /collect {        % <proc> collect <string>
  160.   10 dict begin
  161.   /str 500 string def
  162.   /spos 0 def
  163.   /fpos 0 def
  164.   /f {
  165.     pop length spos add /spos exch store
  166.     spos str length eq { /str str str concatstrings def } if
  167.     str spos str length spos sub getinterval
  168.   } /NullEncode filter def
  169.   exec f closefile
  170.   str 0 spos getinterval end
  171. } def
  172.  
  173. % ------ Top (font) dictionary ------ %
  174.  
  175. /topkeyops mark
  176.   /version 0
  177.   /Notice 1
  178.   /Copyright 32
  179.   /FullName 2
  180.   /FamilyName 3
  181.   /Weight 4
  182.   /isFixedPatch { false 33 nedef }
  183.   /ItalicAngle { 0 34 nedef }
  184.   /UnderlinePosition { -100 35 nedef }
  185.   /UnderlineThickness { 50 36 nedef }
  186.   /PaintType { 0 37 nedef }
  187.   /CharstringType { 2 38 nedef }
  188.   /FontMatrix {
  189.     true 0 1 5 {
  190.       2 index 1 index get {0.001 0 0 0.001 0 0} 3 -1 roll get eq and
  191.     } for
  192.     { pop } { value 39 op } ifelse
  193.   }
  194.   /UniqueID 13
  195.   /FontBBox 5
  196.   /StrokeWidth { 0 40 nedef }
  197.   /XUID 14
  198.   /FontInfo { topkeyops Dict }
  199.     %**** Encoding
  200.   /CharStrings { pop /charstringsoffset fpos store 32767 value 17 op }
  201.   /Private { pop /privateoffset fpos store 32767 value 18 op }
  202. .dicttomark readonly def
  203.  
  204. % ------ Private dictionary ------ %
  205.  
  206. /deltarray {        % [<num> ...] <op> deltarray -
  207.   exch 0 exch { 1 index sub dup value add } forall pop op
  208. } def
  209. /privatekeyops mark
  210.   /BlueValues { 6 deltarray }
  211.   /OtherBlues { 7 deltarray }
  212.   /FamilyBlues { 8 deltarray }
  213.   /FamilyOtherBlues { 9 deltarray }
  214.   /BlueScale { 0.039625 41 nedef }
  215.   /BlueShift { 7 42 nedef }
  216.   /BlueFuzz { 1 43 nedef }
  217.   /StdHW 10
  218.   /StdVW 11
  219.   /StemSnapH { 44 deltarray }
  220.   /StemSnapV { 45 deltarray }
  221.   /ForceBold { false 46 nedef }
  222.   /ForceBoldThreshold { 0 47 nedef }
  223.     % Skip lenIV, it's always -1
  224.   /LanguageGroup { 0 49 nedef }
  225.   /ExpansionFactor { 0.06 50 nedef }
  226.   /initialRandomSeed { 0 51 nedef }
  227.   /Subrs { pop /subroffset fpos store 32767 value 19 op }
  228.   /defaultWidthX { 0 20 nedef }
  229.   /nominalWidthX { 0 20 nedef }
  230. .dicttomark readonly def
  231.  
  232. % ------ Main program ------ %
  233.  
  234. /putoffset {        % <str> <index> <offset> putoffset -
  235.     % The saved index points to the 29 byte, so we must add 1.
  236.   3 copy exch 1 add exch -8 bitshift put
  237.   exch 2 add exch 255 and put
  238. } def
  239.  
  240. /writecff {        % <file> [<font> ...] writecff -
  241.   30 dict begin
  242.   /fonts exch cvlit def
  243.   /cff exch cvlit def
  244.  
  245.   /f cff def
  246.   /fpos 0 def
  247.  
  248.     % We need to pre-construct all the strings so that we know
  249.     % the offsets to fill in.
  250.  
  251.   /names { [ fonts { /FontName get } forall ] Index } collect def
  252.   /sids 20 dict def
  253.   /subrcounts fonts length 200 mul dict def
  254.   /subrs [ fonts {
  255.     /font 1 index def
  256.     /Private get /Subrs .knownget {
  257.       [ exch {
  258.     dup null ne {
  259.       dup subrcounts exch 2 copy .knownget { 1 add } { 1 } ifelse put
  260.       t1tot2
  261.     } if
  262.       } forall ] { Index } collect
  263.     } {
  264.       <>
  265.     } ifelse
  266.   } forall ] def
  267.     % At this point we should use subrcounts to move any duplicated
  268.     % subrs from local to global....
  269.   DEBUG {
  270.     0 subrcounts { exch pop add } forall =only ( total subrs) =
  271.     subrcounts length =only ( distinct subrs) =
  272.     0 subrcounts { 1 sub exch length mul add } forall =only ( space for duplicates) =
  273.   } if
  274.     %****** FOLLOWING IS WRONG, WRONG, WRONG ******%
  275.   /charstrings [ fonts {
  276.     /font 1 index def
  277.     /CharStrings get [ exch {
  278.       exch pop t1tot2
  279.     } forall ] { Index } collect
  280.   } forall ] def
  281.   /subroffset null def
  282.   /privates [ 0 1 fonts length 1 sub {
  283.     /i exch def
  284.     /pstr fonts i get /Private get { privatekeyops Dict } collect def
  285.     /len pstr length def
  286.     pstr subroffset len putoffset    %**** WRONG ****
  287.     pstr
  288.   } for ] def
  289.   /strings { sids StandardSIDs length idIndex } collect def
  290.  
  291.     % Now we can write the real file.
  292.     % Header
  293.   DEBUG { (header ) print fpos == } if
  294.   <01 00 04 02> nextstring
  295.     % Name Index
  296.   DEBUG { (names ) print fpos == } if
  297.   names nextstring
  298.     %****** FOLLOWING IS WRONG, WRONG, WRONG -- OFFSETS MISSING ******%
  299.     % Top Dicts
  300.   DEBUG { (tops ) print fpos == } if
  301.   /charstringsoffset null def
  302.   /privateoffset null def
  303.   fonts {
  304.     dup length 2 add dict copy
  305.     dup /CharstringType 2 put
  306.     topkeyops Dict
  307.   } forall
  308.     % String Index
  309.   DEBUG { (strings ) print fpos == } if
  310.   strings nextstring
  311.     % Charstrings Indexes
  312.   DEBUG { (charstrings) print } if
  313.   charstrings { DEBUG { ( ) print fpos =only } if nextstring } forall
  314.   DEBUG { () = } if
  315.     % Private Dicts
  316.   DEBUG { (privates) print } if
  317.   privates { DEBUG { ( ) print fpos =only } if nextstring } forall
  318.   DEBUG { () = } if
  319.     % Local Subr Indexes
  320.   DEBUG { (subrs) print } if
  321.   subrs { DEBUG { ( ) print fpos =only } if nextstring } forall
  322.   DEBUG { () = } if
  323.  
  324.   DEBUG { (end ) print fpos = flush } if
  325.   end
  326. } def
  327.  
  328. % ---------------- Wrap up ---------------- %
  329.  
  330. currentdict readonly end
  331. /writecffdict exch def
  332.  
  333. /writecff {
  334.   writecffdict begin writecff end
  335. } def
  336.  
  337. % Test case
  338. (t.cff) (w) file dup
  339. [ {
  340. /Bookman-Demi
  341. /Bookman-DemiItalic
  342. /Bookman-Light
  343. /Bookman-LightItalic
  344. /Courier
  345. /Courier-Oblique
  346. /Courier-Bold
  347. /Courier-BoldOblique
  348. /AvantGarde-Book
  349. /AvantGarde-BookOblique
  350. /AvantGarde-Demi
  351. /AvantGarde-DemiOblique
  352. /Helvetica
  353. /Helvetica-Oblique
  354. /Helvetica-Bold
  355. /Helvetica-BoldOblique
  356. /Helvetica-Narrow
  357. /Helvetica-Narrow-Oblique
  358. /Helvetica-Narrow-Bold
  359. /Helvetica-Narrow-BoldOblique
  360. /Palatino-Roman
  361. /Palatino-Italic
  362. /Palatino-Bold
  363. /Palatino-BoldItalic
  364. /NewCenturySchlbk-Roman
  365. /NewCenturySchlbk-Italic
  366. /NewCenturySchlbk-Bold
  367. /NewCenturySchlbk-BoldItalic
  368. /Times-Roman
  369. /Times-Italic
  370. /Times-Bold
  371. /Times-BoldItalic
  372. /Symbol
  373. /ZapfChancery-MediumItalic
  374. /ZapfDingbats
  375.   } { findfont } forall
  376. ] writecff closefile
  377.